home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 02 / winmem32 / calleng.asm < prev    next >
Assembly Source File  |  1991-02-28  |  4KB  |  183 lines

  1. ; ------------- CALLENG.ASM - ENGINE CALLING ROUTINES ---------------
  2.    .xlist
  3.    include cmacros.inc
  4.    .list
  5.    .386
  6.  
  7. sBegin    Data
  8. faraddr   DF     ?
  9. OldESP    DD     ?
  10. OldSS     DW     ?
  11. sEnd
  12.  
  13. sBegin    Code
  14.  
  15. assumes   cs,Code
  16. assumes   ds,Data
  17. ;extrn    doscall:far
  18.  
  19.  
  20. ; the following functions are used to transfer data to and from the
  21. ; communication buffer.
  22.  
  23. cProc     GetFarDword,<FAR,PUBLIC>,<bx,cx,di,si>
  24.    parmW  DataSelector  ; Selector for data segment
  25.    parmD  DataOffset    ; offset of value in data segment
  26. cBegin
  27.    push   ds
  28.    mov    ds,DataSelector
  29.    mov    eax,DataOffset
  30.    mov    ecx,dword ptr [eax]
  31.  
  32.    mov    eax,ecx
  33.    shr    eax,16
  34.    xor    edx,edx
  35.    mov    dx,ax
  36.    mov    ax,cx
  37.  
  38.    pop    ds
  39. cEnd
  40.  
  41. cProc     GetFarByte,<FAR,PUBLIC>
  42.    parmW  DataSelector  ; Selector for data segment
  43.    parmD  DataOffset    ; offset of value in data segment
  44. cBegin
  45.    push   ds
  46.    mov    ds,DataSelector
  47.    mov    eax,DataOffset
  48.    mov    al,byte ptr [eax]
  49.    and    ax,00FFh
  50.    pop    ds
  51. cEnd
  52.  
  53. cProc     PutFarByte,<FAR,PUBLIC>
  54.    parmW  DataSelector  ; Selector for data segment
  55.    parmD  DataOffset    ; offset of value in data segment
  56.    parmB  Value         ; value
  57. cBegin
  58.    push   ds
  59.    mov    ds,DataSelector
  60.    mov    eax,DataOffset
  61.    mov    bl,Value
  62.    mov    byte ptr [eax],bl
  63.    pop    ds
  64. cEnd
  65.  
  66.  
  67. cProc     PutFarWord,<FAR,PUBLIC>
  68.    parmW  DataSelector  ; Selector for data segment
  69.    parmD  DataOffset    ; offset of value in data segment
  70.    parmW  Value         ; value
  71. cBegin
  72.    push   ds
  73.    mov    ds,DataSelector
  74.    mov    eax,DataOffset
  75.    mov    bx,Value
  76.    mov    word ptr [eax],bx
  77.    pop    ds
  78. cEnd
  79.  
  80. cProc     PutFarDWord,<FAR,PUBLIC>
  81.    parmW  DataSelector  ; Selector for data segment
  82.    parmD  DataOffset    ; offset of value in data segment
  83.    parmD  Value         ; value
  84. cBegin
  85.    push   ds
  86.    mov    ds,DataSelector
  87.    mov    eax,DataOffset
  88.    mov    ebx,Value
  89.    mov    dword ptr [eax],ebx
  90.    pop    ds
  91. cEnd
  92.  
  93. cProc     Call32,<FAR,PUBLIC>,<bx,cx,di,si>
  94.    parmW  CodeSelector  ; Selector for code segment
  95.    parmW  DataSelector  ; Selector for data segment
  96.    parmD  CodeOffset    ; offset of routine in code segment
  97.    parmD  InitESP        ; initial value of ESP
  98.    parmD  ParamESI      ; Value of ESI
  99.    parmD  ParamEDI      ; Value of EDI
  100. cBegin
  101. assumes   ds,Data
  102.  
  103. ;  save segment registers (except stack) on old stack
  104.    push   ds
  105.    push   es
  106.    push   gs
  107.  
  108.    mov    esi,ParamESI  ; Pass through parameters
  109.    mov    edi,ParamEDI  ; Pass through parameters
  110.  
  111. ;  set up far address
  112.    mov    eax,CodeOffset
  113.    mov    dword ptr [faraddr],eax
  114.    mov    ax,CodeSelector
  115.    mov    word ptr [faraddr + 4],ax
  116.  
  117. ;  put these in registers so we can safely alter ebp
  118.    mov    edx,InitESP
  119.    mov    ax,DataSelector
  120.  
  121. ;  store ds in gs so we can put DataSelector in ds and still get
  122. ;  faraddr
  123.    mov    cx,ds
  124.    mov    gs,cx
  125.  
  126. ;  save stack state in registers
  127.    mov    ebx,esp
  128.    mov    cx,ss
  129.  
  130. ;  at this point switch to new stack.
  131.  
  132.    mov    ss,ax
  133.    mov    esp,edx
  134.  
  135.    and    esp,0FFFFFFFCh ; align stack on 4 byte boundary for SPEED!
  136.  
  137.    push   ebx           ; push esp on new stack
  138.    push   cx            ; push ss on new stack
  139.    push   bp            ; save ebp
  140.  
  141. ; set up ds,es to be equal to the DataSelector since our kernel code
  142. ; assumes that DS = ES = SS.
  143.  
  144.    mov    es,ax
  145.    mov    ds,ax
  146.  
  147. ;  address this off of gs so ds can be used for DataSeg
  148.  
  149.    call   fword ptr gs:[faraddr] ; call kernel
  150.  
  151. ;  The init routine in the kernel is set up to return the address
  152. ;  of the parameter block in ECX.
  153.  
  154.    pop    bp            ; restore ebp register
  155.    pop    ax            ; restore old stack selector from new stack
  156.    pop    ebx           ; get old stack pointer off of new stack
  157.  
  158.    mov    ss,ax
  159.    mov    esp,ebx        ; restore old stack pointer
  160.  
  161.    ; ecx contains the address of the parameter block that stores
  162.    ; various important addresses in the 32 bit part of the program,
  163.    ; including the offset of the call-through buffer.
  164.    ; Move this address into DX:AX.
  165.  
  166.    mov    eax,ecx        ; get return value
  167.    shr    eax,16
  168.    xor    edx,edx
  169.    mov    dx,ax
  170.    mov    ax,cx
  171.  
  172. ;  restore rest of segment registers
  173.  
  174.    pop    gs
  175.    pop    es
  176.    pop    ds
  177. cEnd
  178.  
  179. sEnd
  180.  
  181. end
  182.  
  183.